package com.ambimmort.ucagent.modules.server.channels;

import org.apache.mina.core.session.IoSession;

import com.ambimmort.ucagent.modules.server.dpi.DPIEndPoint;

/**
 * <p>
 * <em>IChannel</em>是对“通道”概念的抽象。
 * </p>
 * <p>
 * 每一个DPI端点包含两个通道：<em>服务端通道</em> 和 <em>客户端通道</em>。
 * </p>
 * <ul>
 * <li>客户端通道:是指由省DPI汇聚平台发起并连接一个DPI 50000服务端口的通道。</li>
 * <li>服务端通道:是指由DPI发起并连接省DPI汇聚平台50000服务端口的通道。</li>
 * </ul>
 * 
 * <p>
 * 注意：在通道这个概念的抽象中，没有设计connect方法是因为，客户端通道会有connect方法语义而服务端通道不会有。
 * </p>
 * 
 * <p>
 * 在通道的设计上，每个通道，不论是服务端通道还是客户端通道，都必须属于一个DPI端点 （
 * {@link com.ambimmort.ucagent.modules.server.dpi.DPIEndPoint DPIEndPoint} 对象），并 通过
 * {@link uc.agent.component.ucserver.core.DPIEndPoint#getDpiEndPointBean()
 * getDpiEndPointBean()}方法 获取。
 * </p>
 * 
 * <p>
 * 每个通道必须与且仅与一个{@link org.apache.mina.core.session.IoSession IoSession}对象关联。
 * IoSession是 Apache Mina框架中的一个核心部件。请参看：<a href=
 * "http://mina.apache.org/mina-project/apidocs/org/apache/mina/core/session/IoSession.html"
 * >Mina JavaDoc</a>
 * </p>
 * 
 * <p>
 * 除此以外，不论哪种通道都具有断开连接{@link IChannel#disconnect() disconnect()}和 判断是否连接
 * {@link IChannel#isConnected() isConnected()} 这两个行为。
 * </p>
 * 
 * <p>
 * 	最后需要说明的是，本IChannel通道概念的抽象中并没有提及或规定通道的连接方式，这意味着
 *  服务端通道和客户端通道需要根据自己实际情况去约定或实现。详情请见：<br/>
 *  <ul>
 *  	<li>客户端通道：{@link com.ambimmort.ucagent.modules.server.channels.ClientChannel ClientChannel}</li>
 *  	<li>服务端通道：{@link com.ambimmort.ucagent.modules.server.channels.ServerChannel ServerChannel}</li>
 *  </ul>
 * </p>
 * 
 * 
 * @author 何定巍 (hedingwei@ambimmort.com)
 * @version 1.0.0
 * @category 通道
 * @since 1.0.0
 */
public interface IChannel {

	/**
	 *  断开这个通道
	 */
	public abstract void disconnect();

	/**
	 * 获取本通道的{@link org.apache.mina.core.session.IoSession IoSession}对象
	 * @return
	 */
	public abstract IoSession getSession();

	/**
	 * 获取本通道的{@link com.ambimmort.ucagent.modules.server.dpi.DPIEndPoint DPIEndPoint}对象
	 * @return
	 */
	public abstract DPIEndPoint getDpiEndPoint();

	/**
	 * 判断该通道连接是否建立
	 * @return true 则已经连接; false则代表连接断开
	 */
	public abstract boolean isConnected();

}